﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DAO
{
    public class DAOPedido
    {
        public static void guardarPedido(Entidad.EntidadPedido pedido)
        {
            AccesoDato ac = new AccesoDato();
            SqlConnection cn = new SqlConnection();
            SqlTransaction tran = null;
            cn.ConnectionString = ac.getCadena();
            try
            {
                cn.Open();
                tran = cn.BeginTransaction();
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "INSERT INTO pedido (fecha, id_proveedor,total) values (@fecha, @id_proveedor,@total);Select @@Identity";
                cmd.Connection = cn;
                string format = "dd/MM/yyyy";
                string fechaa = pedido.getFecha().ToString(format);
                cmd.Parameters.AddWithValue("@fecha", fechaa);
                cmd.Parameters.AddWithValue("@id_proveedor", pedido.id_proveedor);
                cmd.Parameters.AddWithValue("@total", pedido.total.Value);
                cmd.Transaction = tran;
                //Obtengo el ID del elemento Insertado
                pedido.id_pedido = Convert.ToInt32(cmd.ExecuteScalar());
                foreach (Entidad.EntidadDetallePedido dp in pedido.getDetalles())
                {
                    //Agrego el ID del elemento insertado para que se pueda almacenar
                    dp.id_pedido = pedido.id_pedido.Value;
                    DAODetallePedido.Agregar(dp, cn, tran);
                }
                tran.Commit();
            }
            catch (SqlException ex)
            {
                if (cn.State == System.Data.ConnectionState.Open)
                    tran.Rollback();
                throw new ApplicationException("Error al almacenar el pedido. " + ex.Message);
            }
            finally
            {
                if (cn.State == System.Data.ConnectionState.Open)
                    cn.Close();
            }
        }

        public static List<Entidad.EntidadPedido> getTodos()
        {
            List<Entidad.EntidadPedido> lista = new List<Entidad.EntidadPedido>();
            AccesoDato ad = new AccesoDato();
            try
            {
                String sql = @"Select pedido.id_pedido, pedido.total, pedido.fecha, proveedor.nombre, pedido.id_proveedor from pedido
                            inner join proveedor on proveedor.id_proveedor = pedido.id_proveedor";
                SqlDataReader dr = ad.ejecutarSql(sql, null);

                while (dr.Read())
                {
                    Entidad.EntidadPedido e = new Entidad.EntidadPedido();
                    e.id_pedido = int.Parse(dr["id_pedido"].ToString());
                    e.id_proveedor = int.Parse(dr["id_proveedor"].ToString());
                    e.fecha = Convert.ToDateTime(dr["fecha"].ToString());
                    e.nombre = dr["nombre"].ToString();
                    e.total = float.Parse(dr["total"].ToString());
                    lista.Add(e);
                }
            }
            catch (ApplicationException)
            {
                throw new ApplicationException("Error al obtener todos los pedidos");
            }
            finally
            {
                ad.cerrarDR();
            }

            return lista;
        }
    }
}
